package com.单例设计模式;

public class 饿汉式 { //391
    public static void main(String[] args) {
        //为什么叫饿汉式：  只要类加载就创建对象，如果你只用了了age属性，对象未使用就会资源浪费；
        System.out.println(GrilFrend.age);
        //因为你只调用了age属性，但在类加载的时候就会执行static GrilFrend GR = new GrilFrend("小红");
        // 就会创建一个对象GR；


//        GrilFrend gf1 = GrilFrend.getInstance();  //这是错的，因为构造器私有化，外部不能new
        GrilFrend gf1 = GrilFrend.getGR();//这里是正确的，因为getGR()是static的并且在内部创建并返回一个对象，所以可以调用
        System.out.println(gf1);

        GrilFrend gf2 = GrilFrend.getGR();
        //static已经被加载过一次，当时就创建了一个对象，第二次调用静态GrilFrend.getGR()时 返回的是同一个对象
        System.out.println(gf2);

        System.out.println(gf1 == gf2);//true
        //因为是static修饰的，所以是同一个对象共享，static public  GrilFrend getGR(){}


    }
}

class GrilFrend{
    private String name;
    public static int age = 18;
    private GrilFrend(String name) {
        System.out.println("构造器被调用"); //类加载时创建对象，就会调用构造器，因为对象只会创建一次所以构造器只会执行一次
        this.name = name;
    }

   private static GrilFrend GR = new GrilFrend("小红");  //只会被加载一次，所以不会重复创建对象；
    //因为构造器私有化，所以外部不能new，所以在类加载的时候就实例化一个对象，用到了static，而且只初始化一次
    static public  GrilFrend getGR(){//以为GR是static，为了能在方法中使用到GR，所以用static
        return GR;
    }

    @Override
    public String toString() {
        return "GrilFrend{" +
                "name='" + name + '\'' +
                '}';
    }
}
/**
 * 1.构造器私有化，外部不能new
 * 2.本类内部直接创建对象实例（该对象是static）
 * 3.提供一个共有的静态方法，返回实例对象
 */